import dash
from dash import html, dcc
import feffery_antd_components as fac
from dash.dependencies import Input, Output, State
from peewee import fn

from model import UpdateRecord, DataTable

app = dash.Dash(__name__)

app.layout = html.Div(
    [
        # 注入网页轮询
        dcc.Interval(
            id='interval',
            n_intervals=0,
            interval=5 * 1000  # 假如每隔5秒检查一次数据更新情况
        ),

        # 注入数据库最近一次变更时间存储器
        dcc.Store(id='latest-db-update-datetime'),

        # 数据结果计算展示示例
        html.Div(id='data-summary')

    ],
    style={
        'padding': '100px'
    }
)


@app.callback(
    Output('latest-db-update-datetime', 'data'),
    Input('interval', 'n_intervals'),
    State('latest-db-update-datetime', 'data')
)
def check_db_update(n_intervals, data):

    latest_db_update_datetime = list(UpdateRecord.select(fn.MAX(UpdateRecord.update_datetime)).dicts())[0]['update_datetime']

    if data and latest_db_update_datetime.strftime('%Y-%m-%d %H:%M:%S') == data.get('latest_db_update_datetime'):

        return dash.no_update

    return {
        'latest_db_update_datetime': latest_db_update_datetime.strftime('%Y-%m-%d %H:%M:%S')
    }


@app.callback(
    Output('data-summary', 'children'),
    Input('latest-db-update-datetime', 'data')
)
def update_data_summary(data):

    if data:

        return [
            fac.AntdText('最近更新时间：{}'.format(data['latest_db_update_datetime'])),
            fac.AntdText('总记录数量：{}'.format(len(DataTable.select().dicts())))
        ]

    return dash.no_update

if __name__ == '__main__':
    app.run_server(debug=True)